package cn.com.dcsgo.mapper;

import cn.com.dcsgo.domain.po.SysMenu;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 针对表【sys_menu(菜单权限表)】的数据库操作Mapper
 *
 * @author Dcsgo
 * @since 28/5/2025 上午 8:34
 */

public interface SysMenuMapper {

    int deleteByPrimaryKey(Long id);

    int insert(SysMenu record);

    int insertSelective(SysMenu record);

    SysMenu selectByPrimaryKey(Long id);

    int updateByPrimaryKeySelective(SysMenu record);

    int updateByPrimaryKey(SysMenu record);

    /**
     * 查询所有菜单
     *
     * @return 所有菜单
     */
    List<SysMenu> selectAll();

    /**
     * 判断是否存在指定的菜单编号
     *
     * @param menuId 菜单编号
     * @return 菜单编号
     */
    boolean hasMenuId(@Param("menuId") Long menuId);

    /**
     * 查询用户拥有其权限的菜单列表
     *
     * @param userId 用户id
     * @return 用户拥有其权限的菜单列表
     */
    List<SysMenu> selectByUserId(@Param("userId") Long userId);

    /**
     * 查询全部目录和菜单
     * menu_type 菜单类型（0目录 1菜单 2按钮）
     *
     * @return 全部目录和菜单
     */
    List<SysMenu> selectAllDirectoryAndMenu();

    /**
     * 根据用户编号查询其拥有权限的全部目录和菜单
     *
     * @param userId 用户id
     * @return 拥有权限的全部目录和菜单
     */
    List<SysMenu> selectAllDirectoryAndMenuByUserId(@Param("userId") Long userId);

    /**
     * 查询指定菜单类型和父菜单编号下最大的菜单id
     *
     * @param menuType 菜单类型
     * @param parentId 父菜单编号
     * @return 指定菜单类型和父菜单编号下最大的菜单id，若指定的菜单类型和父菜单编号下没有菜单编号则返回 null(即当前数据是指定菜单类型和父菜单编号下的第一个子元素)
     */
    Long selectMaxMenuIdByMenuTypeAndParentId(@Param("menuType") Integer menuType, @Param("parentId") Long parentId);

    /**
     * 判断指定菜单编号是否有子菜单
     *
     * @param menuId 菜单编号
     * @return 有子菜单返回 true，没有返回 false
     */
    boolean hasChildren(@Param("menuId") Long menuId);
}
